package com.hsoft.zhxy.common.redis;

import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * redis客户端工具类（只包含常用操作），复杂操作可直接使用StringRedisTemplate，可参考 https://www.jianshu.com/nb/29133493
 */
@Log4j2
@Component
public class RedisClient {

    @Autowired
    private StringRedisTemplate template;

    /**
     * 写入单字符串类型的值，永不过期。返回值为Null时代表执行失败。
     * @param key   键
     * @param value 值
     */
    public String set(String key, String value) {
        String result = null;
        try{
            template.opsForValue().set(key, value);
        }catch (Exception e){
            if(log.isErrorEnabled()) log.error("redis写入失败！", e.getMessage());
        }
        return result;
    }

    /**
     * 写入单字符串类型的值，带过期时间。返回值为Null时代表执行失败。
     * @param key     键
     * @param value   值
     * @param timeout 超时时间（秒）
     */
    public String set(String key, String value, long timeout) {
        String result = null;
        try{
            template.opsForValue().set(key, value, timeout, TimeUnit.SECONDS);
        }catch (Exception e){
            if(log.isErrorEnabled()) log.error("redis写入失败！", e.getMessage());
        }
        return result;
    }

    /**
     * 获取单字符串类型的值。返回值为Null时代表执行失败。
     * @param key 键
     * @return 值
     */
    public String get(String key) {
        String result = null;
        try{
            result = template.opsForValue().get(key);
        }catch (Exception e){
            if(log.isErrorEnabled()) log.error("redis获取失败！key : " + key, e.getMessage());
        }
        return result;
    }

    /**
     * 判断key值是否存在
     * @param key
     * @return
     */
    public Boolean hasKey(String key){
        Boolean result = false;
        try{
            result = template.hasKey(key);
        }catch (Exception e){
            if(log.isErrorEnabled()) log.error("redis判断key值是否存在方法失败！key : " + key, e.getMessage());
        }
        return result;
    }

    /**
     * 注入list 集合
     *
     * @param key 键（数组）
     * @return 值（数组）
     */
    public void setList(String key, List<String> value) {
        template.opsForList().leftPushAll(key,value);
    }

    /**
     * 获取List 集合
     * @param key
     * @return
     */
    public List<String> getList(String key) {
        return template.opsForList().range(key, 0, -1);
    }

    /**
     * 设置过期时间
     * @param key
     * @param timeout
     * @param unit
     * @return
     */
    public Boolean expire(String key, long timeout, TimeUnit unit) {
        return template.expire(key, timeout, unit);
    }
}